let $ = {};
$.isLikeArray = function(likeArr) {
    /* 伪数组：本身是对象 |  拥有length属性  | 拥有length-1属性*/
    return typeof likeArr == "object" && Reflect.has(likeArr, "length") && Reflect.has(likeArr, likeArr.length - 1);
}


$.each = function(target, callBack) {
    /* target ：要遍历的目标，可以是对象|数组|伪数组(jQuery) */
    /* callBack：该回调函数接收两个参数(key,value) */
    /* 思路：先检查第一个参数的类型(对象-数组和伪数组) */
    if (Array.isArray(target) || $.isLikeArray(target)) {
        /* for */
        for (let i = 0, len = target.length; i < len; i++) {
            // let flag = callBack.call(target[i], i, target[i]);
            // if (flag == false) break;
            if (callBack.call(target[i], i, target[i]) == false) break;
        }
    } else {
        /* 对象-for..in */
        for (let key in target) {
            let flag = callBack.call(target[key], key, target[key]);
            if (flag == false) break;
        }
    }
}

$.type = function(target) {
    /* 检查是否是基本数据类型的值 */
    if (target == null) return target + ""; /* null || undefined */
    if (typeof target == "function") return "function";
    if (typeof target != "object") return typeof target;
    /* 正则 | 日期 | 对象 | 数组 | Set... */
    // [object RegExp]"
    return Object.prototype.toString.call(target).slice("[object".length + 1, -1).toLowerCase();
}